package engine

import (
	"GoSecKill/api"
	"GoSecKill/conf"
	"GoSecKill/data"
	"GoSecKill/middleware/jwt"
	"GoSecKill/model"
	"encoding/gob"

	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/redis"
	"github.com/gin-gonic/gin"
)

// Visible for test
const SessionHeaderKey = "Authorization"

func SeckillEngine() *gin.Engine {
	router := gin.New()

	// 设置session为Redis存储（但是后来没有用到session，而是用jwt来做用户授权）
	config, err := conf.GetAppConfig()
	if err != nil {
		panic("failed to load redisService config" + err.Error())
	}
	// func NewStore(size int, network, address, password string, keyPairs ...[]byte) (Store, error)
	// size-最大闲置  network:tcp or udp
	store, _ := redis.NewStore(config.App.Redis.MaxIdle, config.App.Redis.Network,
		config.App.Redis.Address, config.App.Redis.Password, []byte("seckill"))
	// Use函数：添加全局的中间件
	// sessions gin中间间，多后端session管理
	router.Use(sessions.Sessions(SessionHeaderKey, store))
	// encoding/gob
	gob.Register(&model.User{})

	// 设置路由
	// user路由组
	userRouter := router.Group("/api/users")
	// Restful原则
	userRouter.POST("", api.RegisterUser) //注册
	userRouter.Use(jwt.JWTAuth())         //这些请求都需要通过jwt做用户授权
	{
		// 动态路由匹配
		userRouter.PATCH("/:username/coupons/:name", api.FetchCoupon)
		// 查询优惠卷
		userRouter.GET("/:username/coupons", api.GetCoupons)
		// 商家添加优惠卷
		userRouter.POST("/:username/coupons", api.AddCoupon)
	}

	// 鉴权组
	authRouter := router.Group("/api/auth") //登录和注销
	{	
		// 默认-登录
		authRouter.POST("", api.LoginAuth)
		// 登出
		authRouter.POST("/logout", api.Logout)
	}

	testRouter := router.Group("/test")
	{
		testRouter.GET("/", api.Welcome)   // 输出 welcome
		testRouter.GET("/flush", func(context *gin.Context) {
			if _, err := data.FlushAll(); err != nil {
				println("Error when flushAll. " + err.Error())
			} else {
				println("Flushall succeed.")
			}
		})
	}

	// 启动秒杀功能的消费者（用来异步更新数据库）
	api.RunSecKillConsumer()

	return router
}
